﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SPMS.Utility;

namespace SPMS.Log.Configuration
{
    /// <summary>
    /// 默认的扩展变量提供者
    /// </summary>
    /// <remarks>提供了扩展变量提供者的默认实现</remarks>
    /// <history>
    /// [zanezeng]               2010/1/21 14:15    创建
    /// </history>
    public sealed class DefaultExtendedVariableProvider : IExtendedVariableProvider
    {
        #region ---Constructor

        /// <summary>
        /// 初始化类型<see cref="DefaultExtendedVariableProvider"/>的新实例
        /// </summary>
        /// <remarks></remarks>
        /// <history>
        /// [zanezeng]               2010/1/21 15:12    创建
        /// </history>
        private DefaultExtendedVariableProvider()
        {
        }

        #endregion

        #region ---IExtendedVariableProvider

        /// <summary>
        /// 获得给定的扩展变量的值
        /// </summary>
        /// <param name="variable">扩展变量的名称</param>
        /// <returns>
        /// 由<paramref name="variable"/>指定的扩展变量的值。如果找不到扩展变量，则返回<c>null</c>引用。
        /// </returns>
        /// <remarks></remarks>
        /// <exception cref="ArgumentNullException"><paramref name="variable"/>为<c>null</c>引用。</exception>
        /// <history>
        /// [zanezeng]               2010/1/21 14:08    创建
        /// </history>
        /// <remarks></remarks>
        /// <history>
        /// [zanezeng]               2010/1/21 14:16    创建
        /// </history>
        public string GetExtendedVariable( string variable )
        {
            //断言参数
            ArgumentAssert.AssertArgumentNotNull( variable, "variable" );

            //用于保存变量的值
            string variableValue = null;

            //则尝试从环境变量中获得变量值
            if (TryGetGetEnvironmentVariable( variable, EnvironmentVariableTarget.Process, out variableValue ))
            {
                //如果加载成功，则返回获得变量值
                return variableValue;
            }

            //尝试从配置文件中获得扩展变量
            variableValue = System.Configuration.ConfigurationManager.AppSettings[variable];

            //判断环境变量是否存在
            if (null != variableValue)
            {
                //输出日志
                if (LoggingContext.MetaLog.IsInfoEnabled)
                {
                    LoggingContext.MetaLog.Info( "从配置文件中成功获得扩展变量'{0}'的值'{1}'", variable, variableValue );
                }

                //如果工厂类型名称存在，则直接返回
                return variableValue;
            }

            //则尝试从环境变量中获得变量值
            if (TryGetGetEnvironmentVariable( variable, EnvironmentVariableTarget.User, out variableValue ))
            {
                //如果加载成功，则返回获得变量值
                return variableValue;
            }

            //则尝试从环境变量中获得变量值
            if (TryGetGetEnvironmentVariable( variable, EnvironmentVariableTarget.Machine, out variableValue ))
            {
                //如果加载成功，则返回获得变量值
                return variableValue;
            }

            //默认返回空字符串
            return string.Empty;
        }

        #endregion

        #region ---Private Method

        /// <summary>
        /// 尝试从环境变量中获得给定变量的值
        /// </summary>
        /// <param name="variable">要获得环境变量的变量名称</param>
        /// <param name="target">环境变量的范围</param>
        /// <param name="value">用于返回环境变量的值，如果给定环境变量的值不存在，则返回<c>null</c>引用。</param>
        /// <returns>
        /// 	<c>true</c>：给定名称的环境变量存在<br/>
        /// 	<c>false</c>：给定名称的环境变量不存在
        /// </returns>
        /// <remarks></remarks>
        /// <history>
        /// [zanezeng]               2010/1/22 11:39    创建
        /// </history>
        private static bool TryGetGetEnvironmentVariable( string variable, EnvironmentVariableTarget target, out string value )
        {
            //设置默认值
            value = null;

            //则尝试从环境变量中获得日志工厂定义
            try
            {
                //从进程环境变量中加载日志工厂配置
                value = System.Environment.GetEnvironmentVariable( variable, target );
            }
            catch (Exception ex)
            {
                //输出日志
                if (LoggingContext.MetaLog.IsInfoEnabled)
                {
                    LoggingContext.MetaLog.Info( ex, "从环境变量'{0:G}'中加载变量'{1}'失败", target, variable );
                }
            }

            //判断环境变量是否存在
            if (null != value)
            {
                //输出日志
                if (LoggingContext.MetaLog.IsInfoEnabled)
                {
                    LoggingContext.MetaLog.Info( "从环境变量'{0:G}'中加载变量'{1}'成功，变量值为'{2}'", target, variable, value );
                }
            }

            //返回
            return (null != value);
        }

        #endregion

        #region ---Property

        /// <summary>
        /// 获得默认的扩展变量提供者实例
        /// </summary>
        /// <value>默认的扩展变量提供者实例</value>
        /// <remarks></remarks>
        /// <history>
        /// [zanezeng]               2010/1/21 15:11    创建
        /// </history>
        public static DefaultExtendedVariableProvider Default
        {
            get
            {
                return DEFAULT_INSTANCE;
            }
        }

        #endregion

        #region ---Field

        /// <summary>
        /// 默认实例
        /// </summary>
        private static readonly DefaultExtendedVariableProvider DEFAULT_INSTANCE = new DefaultExtendedVariableProvider();

        #endregion
    }
}
